lexer grammar LexSam;

/*
@rulecatch { 
  catch (RecognitionException e) {
    throw e;
  }
}


@members {

	protected void mismatch(IntStream input, int ttype, BitSet follow)
	  throws RecognitionException
	{
	  throw new MismatchedTokenException(ttype, input);
	}
	
	public void recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow)
	  throws RecognitionException
	{
	  throw e;
	}

}
*/

options {
  language = Java;
  //k = 5; //ejemplo: interval, asi no cogeria int
  //caseSensitiveLiterals = false; //insensible a mayus y minus
  //backtrack = true;
}

/* tokens {
   NUM_REAL;
   NUM_INTEGER;
   //ID_TERMINAL;
   //ID_NOTERMINAL;
} */

@header {
    package maquinasam.antlr;
}


//PALABRAS RESERVADAS:
//registros
CB : 'CB';
CT : 'CT';
PB : 'PB';
PT : 'PT';
SB : 'SB';
ST : 'ST';
HB : 'HB';
HT : 'HT';
LB : 'LB';
L1 : 'L1';
L2 : 'L2';
L3 : 'L3';
L4 : 'L4';
L5 : 'L5';
L6 : 'L6';
CP : 'CP';


//instrucciones de SAM
LOAD: 'LOAD';
LOADA: 'LOADA';
LOADI: 'LOADI';
LOADL: 'LOADL';
STORE: 'STORE';
STOREI: 'STOREI';
CALL: 'CALL';
CALLI: 'CALLI';
RETURN : 'RETURN';
PUSH: 'PUSH';
POP: 'POP';
JUMP: 'JUMP';
JUMPI: 'JUMPI';
JUMPIF: 'JUMPIF';
HALT: 'HALT';

//rutinas primitivas de SAM
/*ID: 'id';
NOT: 'not';
AND: 'and';
OR: 'or';
INC: 'inc';
DEC: 'dec';
NEG: 'neg';
ADD: 'add';
SUB: 'sub';
MULT: 'mult';
DIV: 'div';
MOD: 'mod';
LT: 'lt';
LE: 'le';
GT: 'gt';
GE: 'ge';
EQ: 'eq';
NE: 'ne';
TO21: 'to21';
TO22: 'to22';
NEW: 'new';
FREE: 'free';
GET: 'get';
PUT: 'put';
*/




//FIN PALABRAS RESERVADAS


BLANCO: (' ' | '\t' | '\r' | '\n') { $channel=HIDDEN; };

fragment DIGITO: ('0'..'9');

/* NUMERO : ( (DIGITO)+ '.') => (DIGITO)+ '.' (DIGITO)* {$type=NUM_REAL;} 
         | (DIGITO)+ {$type=NUM_INTEGER);}; */
         
         
NUM_INTEGER : (DIGITO)+;


fragment LETRA : ('a'..'z') | ('A'..'Z') | '_';
IDENT : LETRA (LETRA | DIGITO)*;
             

DOT: '.';
COLON: ':';
COMMA: ',';

LPARENTHESIS: '(';
RPARENTHESIS: ')';
LBRACKET: '[';
RBRACKET: ']';

PLUS: '+';
MINUS: '-';

COMMENT_LINE: '--' (options {greedy=false;}:.)* ('\r' | '\n') { $channel=HIDDEN; };
COMENTARIO: '/*' (options {greedy=false;}:.)* '*/' { $channel=HIDDEN; };

